
from collections.abc import Iterable
from operator import le

# 如果给定一个list或tuple，我们可以通过for循环来遍历这个list或tuple，这种遍历我们称为迭代（Iteration）。
# List这种数据类型虽然有下标，但很多其他数据类型是没有下标的，但是，只要是可迭代对象，无论有无下标，都可以迭代，比如dict就可以迭代
d = {'a': 1, 'b': 2, 'c': 3}

for key in d:
    print(key, d[key])
# 因为dict的存储不是按照list的方式顺序排列，所以，迭代出的结果顺序很可能不一样。

for  value in d.values():
    print(value)
    
for k, v in d.items():
    print(k, v)

# 所以，当我们使用for循环时，只要作用于一个可迭代对象，for循环就可以正常运行，而我们不太关心该对象究竟是list还是其他数据类型。

# 那么，如何判断一个对象是可迭代对象呢？方法是通过collections.abc模块的Iterable类型判断：

# str是否可迭代 True
print(isinstance('abc', Iterable))

# list是否可迭代 True
print(isinstance([1, 2, 3], Iterable))

# 整数是否可迭代 False
print(isinstance(123, Iterable))

# 使用下标
for i, value in enumerate(['A', 'B', 'C']):
    print(i, value)

# 同时引用了两个变量，在Python里是很常见的，比如下面的代码：
for x, y in [(1, 1), (2, 4), (3, 9)]:
    print(x, y)

# 查找最大值和最小值
def find_min_and_max(l):
    if l == None or len(l) == 0:
        return (None, None)
    x = y = l[0]
    for v in l:
        if v > y:
            y = v
        if v < x:
            x = v
    return (x, y)

if find_min_and_max([]) != (None, None):
    print('测试失败!')
elif find_min_and_max([7]) != (7, 7):
    print('测试失败!')
elif find_min_and_max([7, 1]) != (1, 7):
    print('测试失败!')
elif find_min_and_max([7, 1, 3, 9, 5]) != (1, 9):
    print('测试失败!')
else:
    print('测试成功!')
